package com.laobindj.siji.receiver;

import android.content.Context;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

import com.baidu.android.pushservice.PushMessageReceiver;
import com.laobindj.siji.R;
import com.laobindj.siji.contants.Constants;
import com.laobindj.siji.model.OrderList;
import com.laobindj.siji.utils.LogsUtil;
import com.laobindj.siji.utils.SPUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/*
 * Push消息处理receiver。请编写您需要的回调函数， 一般来说： onBind是必须的，用来处理startWork返回值；
 * onMessage用来接收透传消息； onSetTags、onDelTags、onListTags是tag相关操作的回调；
 * onNotificationClicked在通知被点击时回调； onUnbind是stopWork接口的返回值回调
 * 返回值中的errorCode，解释如下：
 * 0 - Success
 * 10001 - Network Problem
 * 10101 - Integrate Check Error
 * 30600 - Internal Server Error
 * 30601 - Method Not Allowed
 * 30602 - Request Params Not Valid
 * 30603 - Authentication Failed
 * 30604 - Quota Use Up Payment Required
 * 30605 - Data Required Not Found
 * 30606 - Request Time Expires Timeout
 * 30607 - Channel Token Timeout
 * 30608 - Bind Relation Not Found
 * 30609 - Bind Number Too Many
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。
  */

public class MyPushMessageReceiver extends PushMessageReceiver {
    /**
     * TAG to Log
     */
    public static final String TAG = MyPushMessageReceiver.class
            .getSimpleName();
    private boolean hasNewOrder;
    private String sj_id;


    /**
     * 调用PushManager.startWork后，sdk将对push
     * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
     * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
     *
     * @param context   BroadcastReceiver的执行Context
     * @param errorCode 绑定接口返回值，0 - 成功
     * @param appid     应用id。errorCode非0时为null
     * @param userId    应用user id。errorCode非0时为null
     * @param channelId 应用channel id。errorCode非0时为null
     * @param requestId 向服务端发起的请求id。在追查问题时有用；
     * @return none
     */
    @Override
    public void onBind(Context context, int errorCode, String appid,
                       String userId, String channelId, String requestId) {
        String responseString = "onBind errorCode=" + errorCode + " appid="
                + appid + " userId=" + userId + " channelId=" + channelId
                + " requestId=" + requestId;
        Log.d(TAG, responseString);

        if (errorCode == 0) {
            // 绑定成功
            Log.d(TAG, "绑定成功");
        }
        SPUtils.put(context, Constants.CHANNELID, channelId);
        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
    }

    /**
     * 接收透传消息的函数。
     *
     * @param context             上下文
     * @param message             推送的消息
     * @param customContentString 自定义内容,为空或者json字符串
     */
    @Override
    public void onMessage(Context context, String message,
                          String customContentString) {
        String messageString = "透传消息 onMessage=\"" + message
                + "\" customContentString=" + customContentString;
        Log.d(TAG, messageString);

        // 自定义内容获取方式，mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
        if (!TextUtils.isEmpty(customContentString)) {
            JSONObject customJson = null;
            try {
                customJson = new JSONObject(customContentString);
                String myvalue = null;
                if (!customJson.isNull("mykey")) {
                    myvalue = customJson.getString("mykey");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, messageString);
    }

    /**
     * 接收通知到达的函数。
     *
     * @param context             上下文
     * @param title               推送的通知的标题
     * @param description         推送的通知的描述
     * @param customContentString 自定义内容，为空或者json字符串
     */

    @Override
    public void onNotificationArrived(Context context, String title,
                                      String description, String customContentString) {

        String notifyString = "通知到达 onNotificationArrived  title=\"" + title
                + "\" description=\"" + description + "\" customContent="
                + customContentString;
        Log.d(TAG, notifyString);

        LogsUtil.push("notifyString" + notifyString);

        // 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
        String orderid = "";
        if (!TextUtils.isEmpty(customContentString)) {
            JSONObject customJson = null;
            try {
                customJson = new JSONObject(customContentString);
                if (!customJson.isNull("orderid")) {
                    orderid = customJson.getString("orderid");
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        playSound(context);

        //之前的处理订单的代码
//        hasOder(context,customContentString);

         // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
        // 你可以參考 onNotificationClicked中的提示从自定义内容获取具体值
//        updateContent(context, orderid);
    }

    //
    private void hasOder(Context context, String str) {
        try {
            JSONObject jo = new JSONObject(str);
            int status = jo.getInt("status");
            if (status == 200) {

                SPUtils.put(context, "WORK_STATE", new Integer(1));
                Log.e("订单列表onResponse200", sj_id);
                JSONArray resultData = jo.getJSONArray("result");


                List<OrderList> resultList = new ArrayList<OrderList>();

                if (resultData != null && resultData.length() > 0) {
                    //boolean wrong = false;
                    //暂时默认为true
                    boolean wrong = true;

                    for (int i = 0; i < resultData.length(); i++) {
                        JSONObject obj = (JSONObject) resultData.get(i);
                        OrderList order = new OrderList();
                        String orderId = obj.getString("order_id");
                        if (orderId == null || orderId.trim().equals("")) {
                            wrong = true;
                            break;
                        }
                    }
                    if (!wrong) {
                        hasNewOrder = true;
                        //有新订单
                        Log.e("订单列表neworder", sj_id);
                        //写入缓存，让应用启动时接收跳转到接单页面
                        SPUtils.put(context, "NEW_ORDER", new Integer(1));
                        //声音提醒
                        //播放提示音
                        if (mRingtone == null) {
                            String uri = "android.resource://" + context.getPackageName() + "/" + R.raw.callisto;
                            Uri no = Uri.parse(uri);
                            mRingtone = RingtoneManager.getRingtone(context.getApplicationContext(), no);
                        }
                        if (!mRingtone.isPlaying()) {
                            mRingtone.play();
                        }
                    } else {
                        Log.e("订单列表noorder", sj_id);
                        if (mRingtone != null)
                            mRingtone.stop();
                        //如果从有订单变成无订单，要通知刷新订单列表一次，清除旧数据
                        if (hasNewOrder) {
                            hasNewOrder = false;
                            //Thread.sleep(500);
                        } else {
                            //重置缓存数据，当前未有新订单
                            SPUtils.put(context, "NEW_ORDER", new Integer(0));
                        }
                    }
                } else {
                    Log.e("订单列表noorder", sj_id);
                    if (mRingtone != null)
                        mRingtone.stop();
                    //如果从有订单变成无订单，要通知刷新订单列表一次，清除旧数据
                    if (hasNewOrder) {
                        hasNewOrder = false;
                        //Thread.sleep(500);
                    } else {
                        //重置缓存数据，当前未有新订单
                        SPUtils.put(context, "NEW_ORDER", new Integer(0));
                    }
                }
            } else {
                SPUtils.put(context, "WORK_STATE", new Integer(0));
                Log.e("订单列表noorder", sj_id);
                if (mRingtone != null)
                    mRingtone.stop();
                //如果从有订单变成无订单，要通知刷新订单列表一次，清除旧数据
                if (hasNewOrder) {
                    hasNewOrder = false;
                    //Thread.sleep(1000);
                } else {
                    //重置缓存数据，当前未有新订单
                    SPUtils.put(context, "NEW_ORDER", new Integer(0));
                }
            }
        } catch (Exception e) {
            Log.e("订单列表noorder", sj_id);
            if (mRingtone != null)
                mRingtone.stop();
            //如果从有订单变成无订单，要通知刷新订单列表一次，清除旧数据
            if (hasNewOrder) {
                hasNewOrder = false;

            } else {
                //重置缓存数据，当前未有新订单
                SPUtils.put(context, "NEW_ORDER", new Integer(0));
            }
        }

    }


    private static Ringtone mRingtone;

    //播放自定义的声音
    public synchronized void playSound(Context context) {
//        if (!allowMusic) {
//            return;
//        }
        /*20180122if (mRingtone == null) {
            String uri = "android.resource://" + context.getPackageName() + "/" + R.raw.callisto;
            Uri no = Uri.parse(uri);
            mRingtone = RingtoneManager.getRingtone(context.getApplicationContext(), no);
        }
        if (!mRingtone.isPlaying()) {
            mRingtone.play();
            ThreadUtil.runInUIThread(new Runnable() {
                @Override
                public void run() {
                    mRingtone.stop();
                }
            }, 10 * 1000);
        }*/
    }

    /**
     * 接收通知点击的函数。
     *
     * @param context             上下文
     * @param title               推送的通知的标题
     * @param description         推送的通知的描述
     * @param customContentString 自定义内容，为空或者json字符串
     */
    @Override
    public void onNotificationClicked(Context context, String title,
                                      String description, String customContentString) {
        String notifyString = "通知点击 onNotificationClicked title=\"" + title + "\" description=\""
                + description + "\" customContent=" + customContentString;
        Log.d(TAG, notifyString);

        // 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
        if (!TextUtils.isEmpty(customContentString)) {
            JSONObject customJson = null;
            try {
                String orderid = null;
                customJson = new JSONObject(customContentString);
                if (!customJson.isNull("orderid")) {
                    orderid = customJson.getString("orderid");

                    LogsUtil.push("orderid" + orderid);
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, notifyString);
    }

    /**
     * setTags() 的回调函数。
     *
     * @param context     上下文
     * @param errorCode   错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
     * @param successTags 设置成功的tag
     * @param failTags    设置失败的tag
     * @param requestId   分配给对云推送的请求的id
     */
    @Override
    public void onSetTags(Context context, int errorCode,
                          List<String> successTags, List<String> failTags, String requestId) {
        String responseString = "onSetTags errorCode=" + errorCode
                + " successTags=" + successTags + " failTags=" + failTags
                + " requestId=" + requestId;
        Log.d(TAG, responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
    }

    /**
     * delTags() 的回调函数。
     *
     * @param context     上下文
     * @param errorCode   错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
     * @param successTags 成功删除的tag
     * @param failTags    删除失败的tag
     * @param requestId   分配给对云推送的请求的id
     */
    @Override
    public void onDelTags(Context context, int errorCode,
                          List<String> successTags, List<String> failTags, String requestId) {
        String responseString = "onDelTags errorCode=" + errorCode
                + " successTags=" + successTags + " failTags=" + failTags
                + " requestId=" + requestId;
        Log.d(TAG, responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
    }

    /**
     * listTags() 的回调函数。
     *
     * @param context   上下文
     * @param errorCode 错误码。0表示列举tag成功；非0表示失败。
     * @param tags      当前应用设置的所有tag。
     * @param requestId 分配给对云推送的请求的id
     */
    @Override
    public void onListTags(Context context, int errorCode, List<String> tags,
                           String requestId) {
        String responseString = "onListTags errorCode=" + errorCode + " tags="
                + tags;
        Log.d(TAG, responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
    }

    /**
     * PushManager.stopWork() 的回调函数。
     *
     * @param context   上下文
     * @param errorCode 错误码。0表示从云推送解绑定成功；非0表示失败。
     * @param requestId 分配给对云推送的请求的id
     */
    @Override
    public void onUnbind(Context context, int errorCode, String requestId) {
        String responseString = "onUnbind errorCode=" + errorCode
                + " requestId = " + requestId;
        Log.d(TAG, responseString);

        if (errorCode == 0) {
            // 解绑定成功
            Log.d(TAG, "解绑成功");
        }
        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
    }

    private void updateContent(Context context, String orderid) {
//        Log.d(TAG, "updateContent");
//        String logText = "" + Utils.logStringCache;
//
//        if (!logText.equals("")) {
//            logText += "\n";
//        }
//
//        SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");
//        logText += sDateFormat.format(new Date()) + ": ";
//        logText += content;
//
//        Utils.logStringCache = logText;
//
//        Intent intent = new Intent();
//        intent.setClass(context.getApplicationContext(), PushDemoActivity.class);
//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        context.getApplicationContext().startActivity(intent);

        /////+++++++++++///////
//        Intent intent = new Intent();
//        intent.setClass(context.getApplicationContext(), DistributeOrderActivity.class);
//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        intent.putExtra("orderid", orderid);
//        intent.putExtra("ispush", true);
//        context.getApplicationContext().startActivity(intent);


//        Message message = new Message();
//        message.what = 250;
//        message.obj = context;
//        MainActivity.mainHandler.sendMessage(message);
    }

}
